package com.tree.leetcode.array;

/**
 * @ClassName com.tree.leetcode.array
 * Description: LCR 008. 长度最小的子数组
 * <p>
给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。

示例 1：

输入：target = 7, nums = [2,3,1,2,4,3]
输出：2
解释：子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2：

输入：target = 4, nums = [1,4,4]
输出：1
示例 3：

输入：target = 11, nums = [1,1,1,1,1,1,1,1]
输出：0

 * </p>
 * @Author tree
 * @Date 3/14/24 9:08 PM
 * @Version 1.0
 */
public class MinSubArrayLen_lcr008 {
    public static void main(String[] args) {
        int[] nums = new int[]{2,3,1,2,4,3};
        int target = 8;

        System.out.println(maxSubArrayLen(target,nums));

    }

    /**
     * 滑动窗口
     * @param target
     * @param nums
     * @return
     */
    public static int minSubArrayLen(int target, int[] nums) {
        int len = nums.length;
        int left =0; int right=0;
        int sum = 0;
        int ret = Integer.MAX_VALUE;
        while (right <len){
            sum+=nums[right];
            while (left <= right && sum >= target){
                ret = Math.min(right-left+1,ret);
                sum -= nums[left];
                left++;
            }
            right++;

        }
        return ret;

//        int n = nums.length;
//        int ans = Integer.MAX_VALUE;
//        int start = 0, end = 0;
//        int sum = 0;
//        while (end < n) {
//            sum += nums[end];
//            while (sum >= target) {
//                ans = Math.min(ans, end - start + 1);
//                sum -= nums[start];
//                start++;
//            }
//            end++;
//        }
//        return ans == Integer.MAX_VALUE ? 0 : ans;


    }

    public static int maxSubArrayLen(int target, int[] nums) {
        int len = nums.length;
        int left =0; int right=0;
        int sum = 0;
        int ret = Integer.MIN_VALUE;
        while (right <len){
            sum+=nums[right];
            while (left <= right && sum >= target){
                ret = Math.max(right-left+1,ret);
                sum -= nums[left];
                left++;
            }
            right++;

        }
        return ret;



    }




}
